package com.tyam.managedBean;

import java.io.IOException;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.event.CloseEvent;

import com.tyam.bean.Contribuinte;
import com.tyam.bean.Empresa;
import com.tyam.bean.Nota;
import com.tyam.bean.NotaItens;
import com.tyam.dao.DAOFactory;
import com.tyam.validador.GeraMensagem;
import com.tyam.validador.ValidadorFactory;
import com.tyam.validador.Validar;

@ManagedBean
@SessionScoped
public class ControleNota implements Serializable{

	private static final long serialVersionUID = -3888909167925585290L;
	private Nota nota;
	private String mensagem;
	private List<Nota> lista;
	private String textoPesquisa = "";
	private String retorno = "cadastro";
	private Empresa empresa;
	
	private String pesquisaCpfCnpjPrestador;
	private String pesquisaNomePrestador;
	private List<Contribuinte> listaPrestador;

	private String pesquisaCpfCnpjTomador;
	private String pesquisaNomeTomador;
	private List<Contribuinte> listaTomador;
	
	private NotaItens notaItens;
	public ControleNota(){
		
	}

	public void create(){
		nota = new Nota();
		Contribuinte contribuinte = new Contribuinte();
		contribuinte.setCpfCnpj("");
		nota.setContribuintePrestador(contribuinte);
		nota.setContribuinteTomador(contribuinte);
		nota.setEmpresa(getEmpresa());
		nota.setDataEmissao(new Date());
		nota.setReceita(DAOFactory.getReceitaDAO().getSelecionar("ISS").get(0));
		nota.setValorBruto(new BigDecimal(0));
		nota.setValorISS(new BigDecimal(0));
		nota.setValorLiquido(new BigDecimal(0));
		nota.setNotaItens(new ArrayList<NotaItens>());
	}

	public Nota getNota() {
		return nota;
	}

	public void setNota(Nota nota) {
		this.nota = nota;
	}

	public String alterar(){
		return "cadastro";
	}

	public String adicionar(){
		create();
		return "cadastro";
	}

	public void pesquisar(){
		setLista(DAOFactory.getNotaDAO().getSelecionar(textoPesquisa));
	}

	public void pesquisarPrestadorNome(){
		listaPrestador = DAOFactory.getContribuinteDAO().getSelecionar(pesquisaCpfCnpjPrestador, pesquisaNomePrestador);
	}

	public void pesquisarTomadorNome(){
		listaTomador = DAOFactory.getContribuinteDAO().getSelecionar(pesquisaCpfCnpjTomador, pesquisaNomeTomador);
	}
	
	
	public String gravar(){
		
		Validar validador = ValidadorFactory.getValidador();
		validador.validar(nota);
		String[] mensagens = validador.getMensagensValidacao();
		mensagem = GeraMensagem.getMensagem(mensagens);
	
		retorno = "manutencao"; 
		setMensagem(mensagem);	
		if (validador.isOk() && mensagem.isEmpty() ){		
 			if (getNota().getCodigoNota() == 0){
				try {
					
					DAOFactory.getNotaDAO().inserir(nota);
					setMensagem("Cadastro com Sucesso");
					retorno = "manutencao";
					limpar();
				} catch (Exception e) {
					setMensagem("erro: "+e.getMessage());
					FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,getMensagem(), ""));
					retorno = "cadastro";
					return retorno;
				}
				
			}else{
				try {
					DAOFactory.getNotaDAO().alterar(nota);
					setMensagem("Alterado com Sucesso");
					retorno = "manutencao";
					limpar();
				} catch (Exception e) {
					setMensagem("erro: "+e.getMessage());
					FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,getMensagem(), ""));
					retorno = "cadastro";
					return retorno;
				}
			}
 			
			pesquisar();
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_INFO,getMensagem(), ""));
			
		}else{
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,getMensagem(), ""));
			retorno = "cadastro";
		}
		return retorno;
	}

	public void excluir(){
		try {
			DAOFactory.getNotaDAO().excluir(nota);
		} catch (Exception e) {
			setMensagem(e.getMessage());
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,getMensagem(), ""));
			
		}
		pesquisar();
	}

	public void limpar(){
		textoPesquisa = "";
		nota = null;
	}

	public String getMensagem() {
		return mensagem;
	}

	public void setMensagem(String mensagem) {
		this.mensagem = mensagem;
	}

	public List<Nota> getLista() {
		return lista;
	}

	public void setLista(List<Nota> lista) {
		this.lista = lista;
	}


	public String getTextoPesquisa() {
		return textoPesquisa;
	}

	public void setTextoPesquisa(String textoPesquisa) {
		this.textoPesquisa = textoPesquisa;
	}

	public String getRetorno() {
		return retorno;
	}

	public void setRetorno(String retorno) {
		this.retorno = retorno;
	}

	public void retorna(CloseEvent event) throws IOException {   
		FacesContext faces = FacesContext.getCurrentInstance();   
		ExternalContext context = faces.getExternalContext();   
		context.redirect(retorno+".jsf");
	}

	public void pesquisaPrestadorCpfCnpj(){
		
		
		String cpfCnpj = nota.getContribuintePrestador().getCpfCnpj();

		nota.setContribuintePrestador(DAOFactory.getContribuinteDAO().getContribuinte(cpfCnpj));
		if (nota.getContribuintePrestador() == null){
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Contribuinte n&atilde;o encontrado!", ""));

		}

	}
	
	public void pesquisaTomadorCpfCnpj(){
		
		
		String cpfCnpj = nota.getContribuinteTomador().getCpfCnpj();

		nota.setContribuinteTomador(DAOFactory.getContribuinteDAO().getContribuinte(cpfCnpj));
		if (nota.getContribuinteTomador() == null){
			FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,"Contribuinte n&atilde;o encontrado!", ""));

		}

	}
	
	private Empresa getEmpresa(){

		if (empresa == null){
			HttpSession session = null;	
			session = ( HttpSession ) FacesContext.getCurrentInstance().getExternalContext().getSession( true );  
			empresa = (Empresa) session.getAttribute( "empresa" ); 		
		}
		
		return empresa;
	}

	public void delNotaItens(){
		nota.getNotaItens().remove(notaItens);
		notaItens = null;
		calcularValores();
		pesquisar();
	}
	
	public void addNotaItens(){
		nota.getNotaItens().add(notaItens);
		notaItens.setNota(nota);
		notaItens = null;
		calcularValores();
		pesquisar();
	}
	
	private void calcularValores(){
		BigDecimal valorBruto = new  BigDecimal(0);
		BigDecimal valorISS = new  BigDecimal(0);
		BigDecimal valorLiquido = new  BigDecimal(0);
		
		for (NotaItens ni : nota.getNotaItens()) {
			valorBruto = valorBruto.add(ni.getValor());
		}
		
		valorISS = valorISS.add(valorBruto).multiply(nota.getReceita().getAliquota()).divide(new BigDecimal(100));
		valorLiquido = valorLiquido.add(valorBruto).subtract(valorISS);
		
		nota.setValorBruto(valorBruto);
		nota.setValorISS(valorISS);
		nota.setValorLiquido(valorLiquido);
	}
	
	public String getPesquisaNomePrestador() {
		return pesquisaNomePrestador;
	}

	public void setPesquisaNomePrestador(String pesquisaNomePrestador) {
		this.pesquisaNomePrestador = pesquisaNomePrestador;
	}

	public List<Contribuinte> getListaPrestador() {
		return listaPrestador;
	}

	public void setListaPrestador(List<Contribuinte> listaPrestador) {
		this.listaPrestador = listaPrestador;
	}

	public String getPesquisaCpfCnpjPrestador() {
		return pesquisaCpfCnpjPrestador;
	}

	public void setPesquisaCpfCnpjPrestador(String pesquisaCpfCnpjPrestador) {
		this.pesquisaCpfCnpjPrestador = pesquisaCpfCnpjPrestador;
	}

	public String getPesquisaCpfCnpjTomador() {
		return pesquisaCpfCnpjTomador;
	}

	public void setPesquisaCpfCnpjTomador(String pesquisaCpfCnpjTomador) {
		this.pesquisaCpfCnpjTomador = pesquisaCpfCnpjTomador;
	}

	public String getPesquisaNomeTomador() {
		return pesquisaNomeTomador;
	}

	public void setPesquisaNomeTomador(String pesquisaNomeTomador) {
		this.pesquisaNomeTomador = pesquisaNomeTomador;
	}

	public List<Contribuinte> getListaTomador() {
		return listaTomador;
	}

	public void setListaTomador(List<Contribuinte> listaTomador) {
		this.listaTomador = listaTomador;
	}

	public NotaItens getNotaItens() {
		if (notaItens == null){
			notaItens = new NotaItens();
		}
		return notaItens;
	}

	public void setNotaItens(NotaItens notaItens) {
		this.notaItens = notaItens;
	}
	

}